
//todo
// 假设有k个人质和k个绑匪围成一圈。人质的编号从1到k，绑匪的编号从k+1到2k。
// 从编号1开始，每次从其中选出第m个人(隔m-1选出一人)出列。
// 希望求出m的最小值，使得最先出列的k个人都是绑匪，即都是编号从k+1到2k的人。
#include "iostream"
#include "vector"
#include "unordered_map"
#include "algorithm"

class Solution{
public:
    void handle(int n){
        resize(n);
        int layer=0;
        for(int j=n;j>1;j-=2){
            for(int i=0;i<n-layer*2-1;i++){
                vec2[layer][layer+i]=step;
                step++;
            }
            for(int i=0;i<n-layer*2-1;i++){
                vec2[layer+i][width-layer-1]=step;//2+layer*10;
                step++;
            }
            for(int i=0;i<n-layer*2-1;i++){
                vec2[width-layer-1][width-i-1-layer]=step;//3+layer*10;
                step++;
            }
            for(int i=0;i<n-layer*2-1;i++){
                vec2[width-layer-1-i][layer]=step;//4+layer*10;
                step++;
            }
            layer++;
        }
        if(width%2==1){
            vec2[width/2][width/2]=step;
        }
        print();
        ;
    }
    void print(){
        for(auto &a:vec2){
            bool first= true;
            for (auto &b:a) {
                if(!first){
                    printf(" ");
                }
                first=false;
                printf("%d",b);
            }
            printf("\n");
        }
    }
private:
    std::vector<std::vector<int>> vec2;
    int width;
    int step=1;
    void resize(int n){
        vec2.resize(n);
        for(auto &a:vec2){
            a.resize(n);
        }
        width=n;
    }
};
int main() {
    int i=0;
    while (std::cin>>i){
        Solution s;
        s.handle(i);
    }
    return 0;
}

